/*----------------------------------------------------------------------------*\
|
|						Public Interface to Muse Technology
|
|							     www.Muse.com
| Author : SunJun 
| Email : sundoom@msn.com
\*----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////
// $Id: MVar.h,v 1.1 2009/04/03 12:46:09 sunjun Exp $
//////////////////////////////////////////////////////////////////////////

#ifndef __MVar__
#define __MVar__

//////////////////////////////////////////////////////////////////////////

#if defined __cplusplus

//////////////////////////////////////////////////////////////////////////

#include <Muse.h>

//////////////////////////////////////////////////////////////////////////

NAMESPACE_BEGIN

//////////////////////////////////////////////////////////////////////////

	class MObject;

	//////////////////////////////////////////////////////////////////////////

	class API MVar
	{
	public:
		enum VT
		{	
			VT_VOID,
			VT_NULL,
			VT_I8,
			VT_I16,
			VT_I32,
			VT_I64,
			VT_U8,
			VT_U16,
			VT_U32,
			VT_U64,
			VT_F32,
			VT_F64,
			VT_STR,
			VT_WSTR,
			VT_OBJ
		};

	public:
		INLINE MVar();
		INLINE MVar(const MVar& var);
		INLINE MVar(CHAR v);
		INLINE MVar(U8 v);		
		INLINE MVar(I16 v);
		INLINE MVar(U16 v);
		INLINE MVar(I32 v);
		INLINE MVar(U32 v);
		INLINE MVar(I64 v);
		INLINE MVar(U64 v);		
		INLINE MVar(F32 v);
		INLINE MVar(F64 v);
		INLINE MVar(const CHAR* s);
		INLINE MVar(const WCHAR *s);		
		INLINE MVar(const MObject* o);
		INLINE ~MVar();

		INLINE operator CHAR() const;
		INLINE operator U8() const;
		INLINE operator I16() const;
		INLINE operator U16() const;
		INLINE operator I32() const;
		INLINE operator U32() const;
		INLINE operator I64() const;
		INLINE operator U64() const;
		INLINE operator F32() const;
		INLINE operator F64() const;
		INLINE operator CHAR*() const;
		INLINE operator WCHAR*() const;
		INLINE operator MObject*() const;
				
		INLINE MVar& operator=(const MVar& var);

		INLINE MVar& operator=(CHAR v);
		INLINE MVar& operator=(U8 v);
		INLINE MVar& operator=(I16 v);
		INLINE MVar& operator=(U16 v);
		INLINE MVar& operator=(I32 v) ;
		INLINE MVar& operator=(U32 v);
		INLINE MVar& operator=(I64 v);
		INLINE MVar& operator=(U64 v);
		INLINE MVar& operator=(F32 v);
		INLINE MVar& operator=(F64 v);
		INLINE MVar& operator=(const CHAR* s);
		INLINE MVar& operator=(const WCHAR* s);		
		INLINE MVar& operator=(const MObject* o) ;		
		
		INLINE BOOL operator==(const MVar& var) const;
		INLINE BOOL operator!=(const MVar& var) const;

	public:
		INLINE U32 type() const;
		INLINE CHAR value(CHAR v) const;
		INLINE U8 value(U8 v) const;
		INLINE I16 value(I16 v) const;
		INLINE U16 value(U16 v) const;
		INLINE I32 value(I32 v) const;
		INLINE U32 value(U32 v) const;
		INLINE I64 value(I64 v) const;
		INLINE U64 value(U64 v) const;
		INLINE F32 value(F32 v) const;
		INLINE F64 value(F64 v) const;
		INLINE CHAR* value(const CHAR* s) const;
		INLINE WCHAR* value(const WCHAR* s) const;
		INLINE MObject* value(const MObject* o) const;
		INLINE MVar value(const MVar& v) const;
		INLINE VOID convert(VT vt, const MVar* var = NULL);

	private:
		INLINE VOID clear();		

	private:
		struct VAL
		{
			VT vt;
			union 
			{
				CHAR		vi8;
				U8		vu8;
				I16		vi16;
				U16		vu16;
				I32		vi32;
				U32		vu32;
				I64		vi64;
				U64		vu64;
				F32		vf32;
				F64		vf64;
				CHAR	*vstr;
				WCHAR	*vwstr;
				MObject	*vobj;
			};
			VOID *vp;
		}val;
	};

//////////////////////////////////////////////////////////////////////////

NAMESPACE_END

//////////////////////////////////////////////////////////////////////////

#endif // __cplusplus

//////////////////////////////////////////////////////////////////////////

#endif // __MVar__

//////////////////////////////////////////////////////////////////////////